package tsi

import (
	watchmessgae "earth/watch_tcp/watch_message"
	"errors"

	"github.com/sirupsen/logrus"
)

/*
报警数据上报
终端发送:
[DW*YYYYYYYYYYYYYYY*LEN*AL,位置数据(见附录一)]
实例:
[DW*334588000000156*00CD*AL,160918,064153,A,22.570512,N,113.8623267,E,0.00,154.8,0.0,11,
100,100,0,0,00100018,7,0,460,1,9529,21809,155,9529,21242,132,9529,21405,131,9529,63554,
131,9529,63555,130,9529,63556,118,9529,21869,116,0,12.4]
平台回复:
[DW*YYYYYYYYYYYYYYY*LEN*AL]
实例:[DW*334588000000156*0002*AL]
终端状态 00000000（16
进制）
用二进制字符串表示为
0000 0000 0000 0000 0000 0000 0000 0000
含义如下:
左边高16bit表示报警,右边低16bit表示状态.
7
Bit 位(0 开始) 含义(1 有效)
0 低电状态
1 出围栏状态（目前没用到）
2 进围栏状态（目前没用到）
3 手环戴上取下状态
4 手表运行静止状态
16 SOS 报警
17 低电报警
18 出围栏报警（目前没用到）
19 进围栏报警（目前没用到）
20 手环拆除报警
21 跌倒报警
26 落水报警
比如 00200010，即表示 00000000001000000000
000000010000
分别是第四位为 1，第 21 位为 1，对应 21 位是
跌倒报警
*/

/* 位置数据
附录一: 位置数据说明
名称 实例(ASII 码) 说明
日期 140412 (日月年)2012 年 4 月 14 日（0 时区）
时间 101930 (时分秒)10 点 19 分 30 秒（0 时区）
是否定位 A A:定位 V:未定位
纬度 22.564025 按照 DD.DDDDDD 格式定义,此纬度值为:22.5640
25
纬度标识 N N 表示北纬,S 表示南纬. 经度 113.242329 按照 DDD.DDDDDD 格式定义,此经度值为:113.24
2329. 经度标识 E E 表示东经,W 表示西经
速度 5.21 5.21 公里/小时. 方向 152 方向在 152 度. 海拔 100 单位为米
卫星个数 9 表明 GPS 卫星个数
GSM 信号强度 100 表示当前 GSM 信号强度(0-100)
电量 90 表示当前电量等级百分比
计步数 1000 计步数为 1000。为当天的步数
翻滚次数 50 翻滚 50 次
终端状态 00000000（16
进制）
用二进制字符串表示为
0000 0000 0000 0010 0000 0000 0000 0000
含义如下:
左边高16bit表示报警,右边低16bit表示状态.
Bit 位(0 开始) 含义(1 有效)
0 低电状态
1 出围栏状态（目前没用到）
2 进围栏状态（目前没用到）
3 手环戴上取下状态
4 手表运行静止状态
16 SOS 报警
17 低电报警
18 出围栏报警（目前没用到）
19 进围栏报警（目前没用到）
20 手环拆除报警
21 跌倒报警
26
26 落水报警
比如 00200010，即表示 00000000001000000000
000000010000
分别是第四位为 1，第 21 位为 1，对应 21 位是
跌倒报警
基站个数 4 上报基站个数,0 表示不上报基站信息（默认不
带基站数据，定位会失败）
连接基站 ta 1 GSM 时延
MCC 国家码 460 460 代表中国
MNC 网号 02 02 代表中国移动
连接基站位置区域
码
10133 区域码
连接基站编号 5173 基站编号
连接基站信号强度 100 信号强度
附近基站 1 位置区
域码
10133 区域码
附近基站 1 编号 5173 基站编号
附近基站 1 信号强
度
100 信号强度
附近基站 2 位置区
域码
10133 区域码
附近基站 2 编号 5173 基站编号
附近基站 2 信号强
度
100 信号强度
附近基站 3 位置区
域码
10133 区域码
附近基站 3 编号 5173 基站编号
附近基站 3 信号强
度
100 信号强度
… … …
Wifi 信息数量 5 Wifi 个数(最多 5 个),按信号强度排序.
Wifi 1 名字 rrr 第 1 个 wifi 信息名字
Wifi 1 MAC 地址 1c:fa:68:13:a
5:b4
第 1 个 wifi MAC 地址
Wifi 1 信号强度 -61 第 1 个 wifi 信号强度
Wifi 1 名字 abc 第 2 个 wifi 名字
Wifi 1 MAC 地址 1c:fa:68:13:a
5:b5
第 2 个 wifi MAC 地址
Wifi 1 信号强度 -87 第 2 个 wifi 信号强度
… …
*/

type AL struct {
	Date          string // 日期
	Time          string // 时间
	Location      string // 是否定位
	Latitude      string // 纬度
	LatitudeType  string // 纬度表示
	Longitude     string // 经度
	LongitudeType string // 经度表示
	Speed         string // 速度
	Direction     string // 方向
	Altitude      string // 海拔
	Satellite     string // 卫星个数
	GSM           string // gsm 信号强度
	Battery       string // 电量
	StepCount     string // 计步数
	TerminalState string // 终端状态
	BaseStation   string // 基站个数
	WiFi          string // WiFi 个数
}

func DealAL(watchMessage *watchmessgae.WatchMessage, deviceID string) error {
	// 校验消息长度
	if len(watchMessage.MessageContentList) < 17 {
		logrus.Error("message is too short:", watchMessage.MessageContentList)
		return errors.New("message is too short")
	}
	// 解析消息内容
	al := &AL{}
	al.Date = watchMessage.MessageContentList[0]
	al.Time = watchMessage.MessageContentList[1]
	al.Location = watchMessage.MessageContentList[2]
	al.Latitude = watchMessage.MessageContentList[3]
	al.LatitudeType = watchMessage.MessageContentList[4]
	al.Longitude = watchMessage.MessageContentList[5]
	al.LongitudeType = watchMessage.MessageContentList[6]
	al.Speed = watchMessage.MessageContentList[7]
	al.Direction = watchMessage.MessageContentList[8]
	al.Altitude = watchMessage.MessageContentList[9]
	al.Satellite = watchMessage.MessageContentList[10]
	al.GSM = watchMessage.MessageContentList[11]
	al.Battery = watchMessage.MessageContentList[12]
	al.StepCount = watchMessage.MessageContentList[13]
	al.TerminalState = watchMessage.MessageContentList[14]
	al.BaseStation = watchMessage.MessageContentList[15]
	// TODO: 解析基站信息
	//al.WiFi = watchMessage.MessageContentList[16]
	return SendEvent(deviceID, al, "UD")
}
